/*
 * CommunicationAGV.h
 *
 *  Created on: 04/11/2013
 *      Author: gonzalo
 */

#ifndef COMMUNICATIONAGV_H_
#define COMMUNICATIONAGV_H_

#define AGV_TIPO_PEDIDOS 1

#include "../IPC/SharedMemoryInterface.h"
#include "../IPC/MessageQueue.h"
#include "../middleware/MiddlewareCommon.h"
#include "../logger/logger.h"
#include "../channel_common/agent_address_service/AgentAddressService.h"

namespace middleware {

class CommunicationAGV {
public:
	typedef enum{AGV=0,R11,R12,ADP}AGVCommunicationType;
	CommunicationAGV(char key,std::string hostName);
	virtual ~CommunicationAGV();

	static void create(char key,AGVCommunicationType type,std::string hostName);

	static void destroy(char key,std::string hostName);

	/*
	 * Agrega un pedido de canastos para llevar al pie
	 * de los robots correspondientes al AGV.
	 */
	void agregarPedidoCanastos(PedidoPiezas piezas);

	/*
	 * Interfaz para uso del robot AGV
	 */
	std::vector<TipoPieza> obtenerPedidoDePiezas();

	void colocarCanastosEnPosicion(Canasto c[MAX_PIEZAS], int pos);

	void avisarRobot11();

	void avisarRobot12();

private:
	ipc::MessageQueue<PedidoPiezas> colaPedidos;
	ipc::Semaphore semRobotPiezas1;
	ipc::Semaphore semRobotPiezas2;
	static const Uid UID;
	int mtypeReqAGV;
};

} /* namespace middleware */
#endif /* COMMUNICATIONAGV_H_ */
